package com.robertux.leaderboard.util.gestoresModelos;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import com.robertux.leaderboard.beans.EstadoEntidad;
import com.robertux.leaderboard.beans.entities.Evaluacion;

public class GestorEvaluaciones {
	private GestorEntidades<Evaluacion> gestorEvs;
	private Logger logger;
	
	public GestorEvaluaciones() {
		this.gestorEvs = new GestorEntidades<Evaluacion>();
		this.logger = Logger.getLogger(this.getClass());
	}
	
	public List<Evaluacion> getEvaluaciones() {
		TypedQuery<Evaluacion> qry = this.gestorEvs.getEntityManager().createQuery("SELECT ev FROM Evaluacion ev WHERE ev.usuario.estado <> :estado", Evaluacion.class);
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las evaluaciones: " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<Evaluacion> getEvaluaciones(int pagina, int filasPorPagina, String filtro) {
		TypedQuery<Evaluacion> qry = this.gestorEvs.getEntityManager().createQuery("SELECT ev FROM Evaluacion ev WHERE ev.usuario.estado <> :estado"
				+ (filtro != null && filtro.trim().length() > 0? " AND (UPPER(ev.usuario.nombre) LIKE UPPER(:filtro) OR UPPER(ev.usuario.usuario) LIKE UPPER(:filtro) OR UPPER(ev.usuario.nombre) LIKE UPPER(:filtro))": ""), Evaluacion.class);
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		
		if(filtro != null && filtro.trim().length() > 0) {
			qry.setParameter("filtro", "%" + filtro + "%");
		}
		qry.setFirstResult((pagina-1) * filasPorPagina);
		qry.setMaxResults(filasPorPagina);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las evaluaciones: " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<Evaluacion> getEvaluaciones(int idSucursal) {
		TypedQuery<Evaluacion> qry = this.gestorEvs.getEntityManager().createQuery("SELECT ev FROM Evaluacion ev WHERE ev.usuario.sucursalId = :sucId AND ev.usuario.estado <> :estado", Evaluacion.class);
		qry.setParameter("sucId", idSucursal);
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las evaluaciones: " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<Evaluacion> getEvaluaciones(int idSucursal, int pagina, int filasPorPagina, String filtro) {
		TypedQuery<Evaluacion> qry = this.gestorEvs.getEntityManager().createQuery("SELECT ev FROM Evaluacion ev WHERE ev.usuario.sucursalId = :sucId AND ev.usuario.estado <> :estado"
				+ (filtro != null && filtro.trim().length() > 0? " AND (UPPER(ev.usuario.nombre) LIKE UPPER(:filtro) OR UPPER(ev.usuario.usuario) LIKE UPPER(:filtro))": ""), Evaluacion.class);
		qry.setParameter("sucId", idSucursal);
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		
		if(filtro != null && filtro.trim().length() > 0) {
			qry.setParameter("filtro", "%" + filtro + "%");
		}
		qry.setFirstResult((pagina-1) * filasPorPagina);
		qry.setMaxResults(filasPorPagina);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las evaluaciones: " + e.getMessage(), e);
			return null;
		}
	}
	
	public long getTotalEvaluaciones(String filtro) {
		TypedQuery<Long> qry = this.gestorEvs.getEntityManager().createQuery("SELECT count(ev.id) FROM Evaluacion ev WHERE ev.usuario.estado <> :estado"
				+ (filtro != null && filtro.trim().length() > 0? " AND (UPPER(ev.usuario.nombre) LIKE UPPER(:filtro) OR UPPER(ev.usuario.usuario) LIKE UPPER(:filtro))": "")
				, Long.class);
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		
		if(filtro != null && filtro.trim().length() > 0) {
			qry.setParameter("filtro", "%" + filtro + "%");
		}
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return 0;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el total de evaluaciones: " + e.getMessage(), e);
			return 0;
		}
	}
	
	public long getTotalEvaluaciones(int idSucursal, String filtro) {
		TypedQuery<Long> qry = this.gestorEvs.getEntityManager().createQuery("SELECT count(ev.id) FROM Evaluacion ev WHERE ev.usuario.estado <> :estado AND ev.usuario.sucursalId = :sucId"
				+ (filtro != null && filtro.trim().length() > 0? " AND (UPPER(ev.usuario.nombre) LIKE UPPER(:filtro) OR UPPER(ev.usuario.usuario) LIKE UPPER(:filtro))": "")
				, Long.class);
		
		qry.setParameter("estado", EstadoEntidad.ELIMINADO.getCodigo());
		qry.setParameter("sucId", idSucursal);
		
		if(filtro != null && filtro.trim().length() > 0) {
			qry.setParameter("filtro", "%" + filtro + "%");
		}
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return 0;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar el total de evaluaciones: " + e.getMessage(), e);
			return 0;
		}
	}
	
	public Evaluacion getEvaluacion(int id) {
		return this.gestorEvs.getEntidad("Evaluacion", Evaluacion.class, id);
	}
	
	public boolean actualizarEvaluacion(Evaluacion ev) {
		try {
			this.gestorEvs.actualizar(ev);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de actualizar la evaluación: " + e.getMessage(), e);
			return false;
		}
	}
	
	public boolean delEvaluacion(Evaluacion ev) {
		try {
			this.gestorEvs.eliminar(ev);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de eliminar la evaluación: " + e.getMessage(), e);
			return false;
		}
	}
}
